"""
@dataclass 装饰器基本使用示例
Python 3.7+ 引入的装饰器，用于自动生成类的特殊方法
"""

from dataclasses import dataclass


# 1. 基本使用 - 替代传统类定义
print("=== 1. 基本使用示例 ===")

# 传统方式定义类
class PersonOld:
    #以下三行属性定义，是可以省略的，这里显式写出以作对比
    name: str
    age: int
    city: str
    def __init__(self, name, age, city):
        self.name = name
        self.age = age
        self.city = city
    
    #这个方法的作用是自定义在直接打印对象时，要输出的字符串
    # 没有这个方法的话，直接打印不会报错，但会输出类似 <__main__.PersonOld object at 0x...> 的信息
    def __repr__(self):
        return f"PersonOld(name='{self.name}', age={self.age}, city='{self.city}')"

# 使用 @dataclass 装饰器
# 在这个类中不需要手动定义 __init__ 和 __repr__ 方法，它们会自动生成
@dataclass
class Person:
    name: str
    age: int
    city: str

#这里先演示传统方法的类，即OldPerson
old_person1 = PersonOld("老王", 55, "成都")
print(f"old_person1: {old_person1}")
print()

#这里演示被 @dataclass 装饰的类
person1 = Person("张三", 25, "北京")
person2 = Person("李四", 30, "上海")

print(f"person1: {person1}")
print(f"person2: {person2}")
print()


# 2. 自动生成的方法
print("=== 2. 自动生成的方法 ===")

# __eq__ 方法自动生成，可以比较对象
person3 = Person("张三", 25, "北京")
print(f"person1 == person3: {person1 == person3}")  # True
print(f"person1 == person2: {person1 == person2}")  # False

# 访问属性
print(f"姓名: {person1.name}")
print(f"年龄: {person1.age}")
print(f"城市: {person1.city}")
print()


# 3. 默认值
print("=== 3. 默认值示例 ===")

@dataclass
class Student:
    name: str
    age: int
    grade: str = "一年级"  # 默认值
    is_active: bool = True

student1 = Student("小明", 7)
student2 = Student("小红", 8, "二年级")
student3 = Student("小华", 9, "三年级", False)

print(f"student1: {student1}")
print(f"student2: {student2}")
print(f"student3: {student3}")
print()

